CREATE OR REPLACE FUNCTION get_stores_by_average_review()
RETURNS TABLE (
    store_id INT,
    store_name TEXT,
    average_review NUMERIC,
    number_of_reviews BIGINT
)
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY
    SELECT
        s.store_id,
        s.name AS store_name,
        COALESCE(AVG(r.rating), 0) AS average_review,
        COUNT(r.order_num) AS number_of_reviews
    FROM store s
    LEFT JOIN sells se
        ON s.store_id = se.store_id
    LEFT JOIN includes i
        ON se.code = i.code
    LEFT JOIN "order" o
        ON i.order_num = o.order_num
    LEFT JOIN review r
        ON o.order_num = r.order_num
    GROUP BY
        s.store_id,
        s.name
    ORDER BY
        average_review DESC;
END;
$$;